/**
 * @namespace 图片延迟加载扩展
 * @name JF.Lazyload
 * @author Levin
 * @version 1.0
 * @requires jquery.vPreload.js
 * @description
 * 对于要延迟加载的图片，需加属性data-src
 */
JF.M("Lazyload",(function($){

	var p={},
		/** @scope JF.Lazyload.prototype */
		pub={};

	p.module={
		setup:function(){
			this.html_loader=p.opts.tpl_loader;
		},
		loading:function($t,opts){
			
			if((!$t) || ($t.length==0) ) return;

			opts=$.extend({
				//强制忽略图片的src属性。即使有src属性，也进行预加载
				force:false,
				//是否动态生成loading的dom
				loading:true
			},opts||{});

			if($t.jqmData("loaded")) return;
			if( ($t.attr("src")!=='') && (!opts.force) ) return;
			var src=$t.jqmData("src");
			
			if(!src) return;

			this.preload($t,src,opts);

		},
		preload:function($t,src,opts){
			src=[src];
			var $temp=null;
			if(opts.loading){
				$temp=$(this.html_loader);
				$t.after($temp);
				//Attach canvas loading
				//JF.Loader.Attach($temp,{autoRun:true});
				$temp.cvloader({autoRun:true});
				$temp=null;
			}
			
			$.preload(src,{
				noCache:true,
				loaded_all:function(){
					$t.jqmData("loaded",true);

					if(opts.loading){
						//$t.attr("src",src[0]);
						
						$t.next().fadeOut("fast",function(){
							$t.attr("src",src[0]);
							$temp=$(this);
							//JF.Loader.Detach($temp,true);
							$.fn.cvloader.Detach($temp,true);
							$temp.remove();
						});
						
					}else{
						$t.attr("src",src[0]);
					};
				}
			});
		}
	};

	/**
	 * 初始化图片延迟加载模块。
	 * @description init方法是模块实现模块工厂的接口方法，仅供工厂类JF内部调用
	 * @public
	 * @name JF.Lazyload.init
	 * @function
	 * @param {Object} 配置对象
	 */
	pub.init=function(opts){
		p.opts=$.extend({
			tpl_loader:'<div class="ui-loader" style="display:block"><span class="ui-icon ui-icon-loading spin"></span></div>'
		},opts||{});
	};
	/** @private */
	pub.onLoad=function(){
		p.module.setup();
	};
	/**
	 * 预加载指定的图片
	 * @name JF.Lazyload.Loading
	 * @public
	 * @function
	 * @param {jQuery Dom} $t 指定的图片jq对象
	 * @param {Object} opts 配置对象
	 */
	pub.Loading=$.proxy(p.module.loading,p.module);

	return pub;

})(jQuery));